
package org.epsi.blokus.tools;

import java.awt.Color;
import java.util.Hashtable;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.UnicodeFont;
import org.newdawn.slick.font.effects.ColorEffect;
import org.newdawn.slick.font.effects.OutlineEffect;
import org.newdawn.slick.font.effects.ShadowEffect;

/**
 * Gestion des polices de caractères Unicode
 * @author julien.lafont
 */
public class FontsUtil {

    // Polices en cache
    public static Hashtable<String, UnicodeFont> cacheFont = new Hashtable<String, UnicodeFont>();

    /**
     * Génère une police simple (ou la récupère dans le cache si elle existe déjà )
     * @param nom : Nom de la police ( sans le .ttf )
     * @param size : Taille
     * @param color : Couleur (awt)
     * @param bold : Gras ?
     * @param italic : Italique ?
     * @return
     */
    public static UnicodeFont getFont(String nom, int size, Color color, boolean bold, boolean italic)
    {
        // La police est-elle en cache ?
        String key = nom+size+color.toString()+bold+italic;
        if (cacheFont.containsKey(key)) return cacheFont.get(key);

        try {
            // Génère la police
            String fontPath = "/res/Fonts/" + nom + ".ttf";
            UnicodeFont uFont = new UnicodeFont(fontPath, size, bold, italic);
            uFont.addAsciiGlyphs();
            uFont.addGlyphs(400, 600);
            uFont.getEffects().add(new ColorEffect(color));
            uFont.loadGlyphs();

            // Ajoute la police au cache
            cacheFont.put(key, uFont);

            return uFont;
            
        } catch (SlickException ex) {
            Logger.getLogger(FontsUtil.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
        
    }

    /**
     * Génère une police avec une ombre
     * @param nom
     * @param size
     * @param color
     * @param colorShadow
     * @param xShadow
     * @param yShadow
     * @param opacityShadow
     * @param bold
     * @param italic
     * @return
     */
    public static UnicodeFont getFontShadow(String nom, int size, Color color, Color colorShadow, int xShadow, int yShadow, float opacityShadow, boolean bold, boolean italic)
    {
        String key = "Shadow"+nom+size+color.toString()+bold+italic+colorShadow.toString()+xShadow+yShadow+opacityShadow;
        if (cacheFont.containsKey(key)) return cacheFont.get(key);
        
        try {
            String fontPath = "/res/Fonts/" + nom + ".ttf";
            UnicodeFont uFont = new UnicodeFont(fontPath, size, bold, italic);
            uFont.addAsciiGlyphs();
            uFont.addGlyphs(400, 600);
            uFont.getEffects().add(new ShadowEffect(colorShadow, xShadow, yShadow, opacityShadow));
            uFont.getEffects().add(new ColorEffect(color));
            uFont.loadGlyphs();

            cacheFont.put(key, uFont);
            return uFont;
        } catch (SlickException ex) {
            Logger.getLogger(FontsUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * Génère une police avec une lueur extérieure
     * @param nom
     * @param size
     * @param color
     * @param colorOutline
     * @param wOutline
     * @param bold
     * @param italic
     * @return
     */
    public static UnicodeFont getFontShadow(String nom, int size, Color color, Color colorOutline, int wOutline,  boolean bold, boolean italic)
    {

        String key = "Outline"+nom+size+color.toString()+bold+italic+colorOutline.toString()+wOutline;
        if (cacheFont.containsKey(key)) return cacheFont.get(key);

        try {
            String fontPath = "/res/Fonts/" + nom + ".ttf";
            UnicodeFont uFont = new UnicodeFont(fontPath, size, bold, italic);
            uFont.addAsciiGlyphs();
            uFont.addGlyphs(400, 600);
            uFont.getEffects().add(new ColorEffect(color));
            uFont.getEffects().add(new OutlineEffect(wOutline, colorOutline));
            uFont.loadGlyphs();

            cacheFont.put(key, uFont);
            return uFont;

        } catch (SlickException ex) {
            Logger.getLogger(FontsUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

   


    /**
     * Retourne la coordonnée X pour centrer un texte
     * @param txt : texte à écrire
     * @param font : Police unicode à utiliser
     * @param x : Position x minimale
     * @param width : Taille de l'espace disponible
     * @return
     */
    public static int getX_CenteredText(String txt, UnicodeFont font, int x, int width)
    {
        int size = font.getWidth(txt);
        if (size>width) return x;
        else {
            return Math.round(x+width/2-size/2);
        }
    }

    /**
     * Retourne la coordonnée X pour aligner un texte à droite
     * @param txt
     * @param font
     * @param x
     * @param width
     * @return
     */
    public static int getX_RightText(String txt, UnicodeFont font, int x, int width)
    {
        int size = font.getWidth(txt);
        return x+width-size;
    }

}
